package net.homeip.mmhg.events;

import java.util.Date;

import net.homeip.mmhg.domain.Task;
import net.homeip.mmhg.game.Position;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.joda.time.DateTime;

/**
 * Support logging functions for events.
 * 
 * @author ilya gerasimov
 *
 */
class EventPublisherImpl implements EventPublisher {
	
	private static final Log log = LogFactory.getLog(EventPublisher.class);

	@Override
	public void publish(Event event) {
		
		switch (event.getType()) {
			case GAME_STARTED:
				onGameStarted();
				break;
			case GAME_STOPPED:
				onGameStopped();
				break;
			case GAME_RESET:
				onGameReset();
				break;
			case NEW_TASK:
				onNewTask(((PositionEvent) event).getPosition());
				break;
			case NO_MORE_TASKS:
				onNoMoreTasks(((PositionEvent) event).getPosition());
				break;
			case TASK_STATE_CHANGED:
				onTaskStateChanged(((PositionEvent) event).getPosition());
				break;
			case TASK_FINISHED:
				onTaskFinished(((PositionEvent) event).getPosition());
				break;
			case TASK_REJECTED:
				onTaskRejected(((PositionEvent) event).getPosition());
				break;
			case FORCE_REJECT:
				onForceRejecting(((PositionEvent) event).getPosition());
				break;
			case TOO_MANY_ERRORS:
				onTooManyErrors(((PositionEvent) event).getPosition());
				break;
			case TEAM_BLOCKED:
				onTeamBlocked(((PositionEvent) event).getPosition());
				break;
			case TEAM_UNBLOCKED:
				onTeamUnblocked(((PositionEvent) event).getPosition());
				break;
			case TASK_BLOCKED:
				onTaskBlocked(((TaskEvent) event).getTask());
				break;
			case TASK_UNBLOCKED:
				onTaskUnblocked(((TaskEvent) event).getTask());
				break;
			default:
				break;
		}
	}
	
	private void onGameStarted() {
		log.debug("Игра начата в " + new Date().toString());	
	}
	
	private void onGameStopped() {
		log.debug("Игра остановлена в " + new Date().toString());	
	}
	
	private void onGameReset() {
		log.debug("Состояние игры сброшено в " + new Date().toString());
	}
	
	private void onNewTask(Position position) {
		log.debug("Команда '" + 
				position.getTeam().getName() + 
				"' получила новое задание '" + 
				position.getObtainedTask().getTask().getName() + 
				"' в " + 
				new DateTime().toString());
	}
	
	private void onTaskRejected(Position position) {
		log.debug("Команда '" + 
				position.getTeam().getName() + 
				"' слила задание '" + 
				position.getObtainedTask().getTask().getName() + 
				"' в " + 
				new DateTime().toString());
	}
	
	private void onForceRejecting(Position position) {
		log.debug("Команде '" + 
				position.getTeam().getName() + 
				"' было слито задание '" + 
				position.getObtainedTask().getTask().getName() + 
				"' в " + 
				new DateTime().toString());
	}
	
	private void onTooManyErrors(Position position) {
		log.debug("Команда '" + 
				position.getTeam().getName() + 
				"' слила задание '" + 
				position.getObtainedTask().getTask().getName() + 
				"' из-за слишком большого числа неправильных ответов в " + 
				new DateTime().toString());

	}
	
	private void onTeamBlocked(Position position) {
		log.debug("Команда '" + 
				position.getTeam().getName() + 
				"' была заблокирована в " + 
				new DateTime().toString());
	}
	
	private void onTeamUnblocked(Position position) {
		log.debug("Команда '" + 
				position.getTeam().getName() + 
				"' была разблокирована в " + 
				new DateTime().toString());
	}
	private void onTaskStateChanged(Position position) {
		log.debug("Задание '" + 
				position.getObtainedTask().getTask().getName() + 
				"' для команды '" +
				position.getTeam().getName() + 
				"' перешло в состояние '" + 
				position.getObtainedTask().getState() + 
				"' в " + 
				new DateTime().toString());
	}
	
	private void onTaskFinished(Position position) {
		log.debug("Задание '" + 
				position.getObtainedTask().getTask().getName() + 
				"' для команды '" +
				position.getTeam().getName() + 
				"' завершено с результатом '" + 
				position.getObtainedTask().getResult() + 
				"' в " + 
				new DateTime().toString());
	}
	
	private void onTaskBlocked(Task task) {
		log.debug("Задание '" + 
				task.getName() + 
				"' было заблокировано в " + 
				new DateTime().toString());
	}
	
	private void onTaskUnblocked(Task task) {
		log.debug("Задание '" + 
				task.getName() + 
				"' было разблокировано в " + 
				new DateTime().toString());
	}
	
	private void onNoMoreTasks(Position position) {
		log.debug("Команда '" + 
				position.getTeam().getName() + 
				"' не получила очередного задания и закончила игру в " + 
				new DateTime().toString());
	}
}
